# ==============================================
# 导入层
# ==============================================
from . import config as config_module               # 导入配置模块中的全局变量
from .Android_intent import open_uri_activity       # 导入Android_intent模块
from .lanying_HID import BlueHid                    # 导入已加载的蓝影键鼠模块
import time                                         # 时间操作模块（用于延时、计时等）
from ascript.android.node import Selector           # 导AS控件包（用于安卓界面控件选择操作）
from ascript.android.system import Clipboard        # 从安卓系统模块导入剪贴板功能
from .feishu_api import *                           # 导入飞书API模块
import json                                         # 导入json模块


# ==============================================
# 封装层
# ==============================================
#通过HID在指定坐标位置粘贴输入内容
def HID_content_input(x, y, data):
    """
    通过HID在指定坐标位置粘贴输入内容

    参数:
        x (int): 点击坐标的X轴位置
        y (int): 点击坐标的Y轴位置
        data (str): 要输入的数据内容

    返回:
        bool: 操作成功返回True，失败返回False
    """
    try:
        # 将文本存入剪贴板
        Clipboard.put(data)

        # 点击指定坐标位置
        BlueHid.click(x, y)

        # 等待点击响应
        time.sleep(0.5)

        # 执行粘贴操作
        BlueHid.paste()

        return True  # 操作成功

    except Exception as e:
        print(f"HID输入失败: {str(e)}")
        return False  # 操作失败
    


def send_message(username, user_id, xhs_id, message):
    """
    向指定小红书用户发送私信消息
    
    参数:

        username (str): 接收消息的用户名称
        user_id (str): 小红书用户ID
        xhs_id (str): 小红书用户ID
        message (str): 要发送的消息内容
        
    返回:
        bool: 消息发送成功返回True，否则返回False
    """

    
    try:
        # 1. 打开小红书指定ID的个人主页页面
        print(f"[发送消息] 正在打开用户 {user_id} 的个人主页...")
        activity = f"xhsdiscover://user/{user_id}"
        web_window = open_uri_activity(activity)

        if not web_window:
            print("[发送消息] 打开小红书指定ID的个人主页页面失败")

            # 发消息给飞书日志表格
            add_log_data(
                coze_token=config_module.coze_token, 
                adddata_workflow_id=config_module.adddata_workflow_id, 
                log_app_token=config_module.log_app_token, 
                title="【消息未发送】打开用户主页失败", 
                content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 无法打开小红书用户主页",
                tag="消息发送"
            )
            return False

        print("[发送消息] 打开小红书指定ID的个人主页页面成功")
        time.sleep(1.5)  # 增加等待时间，确保页面完全加载

        # 2. 查找并点击私信按钮
        button_to_use = None
        
        # 尝试查找"发消息"按钮
        messaged_node = Selector(6).desc("发消息").find()
        if messaged_node and hasattr(messaged_node, 'center_x') and hasattr(messaged_node, 'center_y'):
            print("[发送消息] 找到'发消息'按钮")
            button_to_use = messaged_node
        else:
            # 尝试查找"私信"文本按钮作为备选
            letter_node = Selector(6).type("TextView").text("私信").find()
            if letter_node and hasattr(letter_node, 'center_x') and hasattr(letter_node, 'center_y'):
                print("[发送消息] 找到'私信'文本按钮")
                button_to_use = letter_node
        
        # 检查是否找到可用按钮
        if not button_to_use:
            print("[发送消息] 未找到可用的私信按钮，无法继续")

            # 发消息给飞书日志表格
            add_log_data(
                coze_token=config_module.coze_token, 
                adddata_workflow_id=config_module.adddata_workflow_id, 
                log_app_token=config_module.log_app_token, 
                title="【消息未发送】未找到私信按钮", 
                content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 个人主页未找到可用的私信/发消息按钮",
                tag="消息发送"
            )

            return False
            
        # 点击私信按钮
        print(f"[发送消息] 点击消息按钮，坐标：{button_to_use.center_x}, {button_to_use.center_y}")
        BlueHid.click(button_to_use.center_x, button_to_use.center_y)
        
        # 等待私信页面加载
        time.sleep(2.5)  # 增加等待时间，确保聊天界面完全加载

        # 3. 查找聊天输入框
        chatting_node = Selector(6).type("EditText").find()
        if not chatting_node:
            print("[发送消息] 未找到聊天输入框，无法继续")
            
            # 发消息给飞书日志表格
            add_log_data(
                coze_token=config_module.coze_token, 
                adddata_workflow_id=config_module.adddata_workflow_id, 
                log_app_token=config_module.log_app_token, 
                title="【消息未发送】未找到聊天输入框", 
                content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 聊天界面未找到输入框控件",
                tag="消息发送"
            )

            return False
        
        # 确保聊天输入框有必要的属性
        if not hasattr(chatting_node, 'center_x') or not hasattr(chatting_node, 'center_y'):
            print("[发送消息] 聊天输入框缺少必要的坐标属性，无法继续")
           
            # 发消息给飞书日志表格
            add_log_data(
                coze_token=config_module.coze_token, 
                adddata_workflow_id=config_module.adddata_workflow_id, 
                log_app_token=config_module.log_app_token, 
                title="【消息未发送】聊天输入框缺少坐标属性", 
                content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 找到聊天输入框但无法获取其坐标位置",
                tag="消息发送"
            )

            return False
            
        print(f"[发送消息] 找到聊天输入框，坐标：{chatting_node.center_x}, {chatting_node.center_y}")

        # 4. 输入消息内容
        print(f"[发送消息] 正在输入消息内容...")
        Input_results = HID_content_input(chatting_node.center_x, chatting_node.center_y, message)
        if not Input_results:
            print("[发送消息] 消息输入失败，无法继续")
            
            # 发消息给飞书日志表格
            add_log_data(
                coze_token=config_module.coze_token, 
                adddata_workflow_id=config_module.adddata_workflow_id, 
                log_app_token=config_module.log_app_token, 
                title="【消息未发送】消息内容输入失败", 
                content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 找HID内容输入操作失败",
                tag="消息发送"
            )

            return False
            
        # 等待输入完成
        time.sleep(1.5)

        # 5. 查找并点击发送按钮
        try:
            sending_node_all = Selector().text("发送").type("TextView").clickable(True).find_all()
            
            # 检查是否找到任何发送按钮
            if not sending_node_all or len(sending_node_all) == 0:
                print("[发送消息] 未找到任何发送按钮，无法继续")

                # 发消息给飞书日志表格
                add_log_data(
                    coze_token=config_module.coze_token, 
                    adddata_workflow_id=config_module.adddata_workflow_id, 
                    log_app_token=config_module.log_app_token, 
                    title="【消息未发送】未找到发送按钮", 
                    content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 聊天界面未找到任何发送按钮控件",
                    tag="消息发送"
                )

                return False
                
            # 取最后一个发送按钮（通常是我们需要的那个）
            sending_node = sending_node_all[-1]
            
            # 检查发送按钮是否有rect属性
            if not sending_node or not hasattr(sending_node, 'rect'):
                print("[发送消息] 发送按钮缺少必要的区域属性，无法继续")

                # 发消息给飞书日志表格
                add_log_data(
                    coze_token=config_module.coze_token, 
                    adddata_workflow_id=config_module.adddata_workflow_id, 
                    log_app_token=config_module.log_app_token, 
                    title="【消息未发送】发送按钮缺少区域属性", 
                    content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 找到发送按钮但无法获取其点击区域",
                    tag="消息发送"
                )

                return False
                
            # 提取按钮区域
            sending_position = sending_node.rect
            print(f"[发送消息] 找到发送按钮，区域：{sending_position.left}, {sending_position.top}, "
                  f"{sending_position.right}, {sending_position.bottom}")
            
            # 6. 尝试点击发送按钮（最多重试3次）
            retry_count = 0
            max_retries = 3
            
            while retry_count < max_retries:
                # 点击发送按钮
                print(f"[发送消息] 尝试第 {retry_count + 1} 次点击发送按钮...")
                BlueHid.rangeClick(sending_position.left, sending_position.top, 
                                 sending_position.right, sending_position.bottom)
                
                # 等待消息发送
                time.sleep(1.8)  # 适当延长等待时间
                
                # 检查输入框是否为空，如果为空则认为点击发送有效
                try:
                    input_node = Selector(6).type("EditText").find()
                    input_text = input_node.text if input_node else "未找到输入框"
                    
                    if not input_node:
                        print("[发送消息] 无法检查输入框状态，假定发送成功")
                        break
                        
                    if not input_text:  
                        print(f"[发送消息] 成功点击发送，尝试次数: {retry_count + 1}")
                        break
                    else:
                        print(f"[发送消息] 第 {retry_count + 1} 次尝试点击发送未成功，再次尝试...")
                        retry_count += 1
                        time.sleep(1.2)  # 短暂等待后再次尝试
                except Exception as e:
                    print(f"[发送消息] 检查输入框状态时出错：{e}，假定发送成功")
                    break
            
            # 7. 检查发送是否成功
            if retry_count == max_retries:
                print(f"[发送消息] 尝试 {max_retries} 次后仍未能发送消息")

                # 发消息给飞书日志表格
                add_log_data(
                    coze_token=config_module.coze_token, 
                    adddata_workflow_id=config_module.adddata_workflow_id, 
                    log_app_token=config_module.log_app_token, 
                    title="【消息未发送】点击发送按钮失败", 
                    content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 尝试点击发送按钮{max_retries}次后仍未成功",
                    tag="消息发送"
                )

                return False
            
            # 8. 尝试验证消息是否真正发送成功
            print("[发送消息] 正在验证消息是否成功发送...")
            time.sleep(1.0)  # 给予足够时间让消息出现在对话中
            
            try:
                all_dialogue_node = Selector(6).type("TextView").clickable(True).find_all()
                
                # 遍历对话内容查找是否成功发送
                message_sent = False
                if all_dialogue_node and len(all_dialogue_node) > 0:
                    for node in all_dialogue_node:
                        if node.text and message in node.text:
                            message_sent = True
                            print("[发送消息] 验证成功：消息内容已在对话中找到")
                            break
                    
                    if not message_sent:
                        print("[发送消息] 验证警告：未在对话中找到消息内容，但消息可能已发送")

                        # 发消息给飞书日志表格
                        add_log_data(
                            coze_token=config_module.coze_token, 
                            adddata_workflow_id=config_module.adddata_workflow_id, 
                            log_app_token=config_module.log_app_token, 
                            title="【警告】消息可能未正确发送", 
                            content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 未在对话中找到消息内容，但输入框已清空，消息可能已发送",
                            tag="消息发送"
                        )


                else:
                    print("[发送消息] 验证警告：未找到任何对话内容，但消息可能已发送")
         
                    # 发消息给飞书日志表格
                    add_log_data(
                        coze_token=config_module.coze_token, 
                        adddata_workflow_id=config_module.adddata_workflow_id, 
                        log_app_token=config_module.log_app_token, 
                        title="【警告】无法验证消息发送状态", 
                        content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 未找到任何对话内容，无法验证消息是否已发送",
                        tag="消息发送"
                    )

                
                # 如果输入框已清空，我们更倾向于认为消息已发送成功
                return True
                
            except Exception as e:
                print(f"[发送消息] 验证消息发送状态时出错：{e}")

                # 发消息给飞书日志表格
                add_log_data(
                    coze_token=config_module.coze_token, 
                    adddata_workflow_id=config_module.adddata_workflow_id, 
                    log_app_token=config_module.log_app_token, 
                    title="【警告】验证消息发送状态时出错", 
                    content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 验证消息发送状态时发生异常: {e}",
                    tag="消息发送"
                )

                # 如果我们已经到达这一步，输入框已清空，我们假定消息已发送
                return True
                
        except IndexError as e:
            print(f"[发送消息] 处理发送按钮时发生索引错误：{e}")

            # 发消息给飞书日志表格  
            add_log_data(
                coze_token=config_module.coze_token, 
                adddata_workflow_id=config_module.adddata_workflow_id, 
                log_app_token=config_module.log_app_token, 
                title="【消息未发送】处理发送按钮时发生索引错误", 
                content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 处理发送按钮时发生索引错误: {e}",
                tag="消息发送"
            )

            return False
        except Exception as e:
            print(f"[发送消息] 点击发送按钮过程中出错：{e}")

            # 发消息给飞书日志表格  
            add_log_data(
                coze_token=config_module.coze_token, 
                adddata_workflow_id=config_module.adddata_workflow_id, 
                log_app_token=config_module.log_app_token, 
                title="【消息未发送】点击发送按钮过程中出错", 
                content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 点击发送按钮过程中发生异常: {e}",
                tag="消息发送"
            )
            return False

    except Exception as e:
        error_msg = f"发送消息过程中发生异常：{e}"
        print(f"[发送消息] {error_msg}")
        
        # 发消息给飞书日志表格  
        add_log_data(
            coze_token=config_module.coze_token, 
            adddata_workflow_id=config_module.adddata_workflow_id, 
            log_app_token=config_module.log_app_token, 
            title="【消息未发送】发送过程中发生异常", 
            content=f"**设备编号**: {config_module.number}\n**发送账号**: {config_module.my_name}\n**我的ID**: {config_module.my_id}\n**接收用户**: {username}\n**用户ID**: {xhs_id }\n**发送内容**: {message }\n**错误原因**: 发送消息过程中发生异常: {e}",
            tag="消息发送"
        )
        
        return False


#处理飞书表中的任务，查询待处理数据，发送消息并更新记录状态
def handle_feishu_task():
    """
    处理飞书表中的任务，查询待处理数据，发送消息并更新记录状态
    
    参数:
        ACCESS_TOKEN (str): 扣子API访问令牌
        querydata_workflow_id (str): 数据查询工作流ID
        modifydata_workflow_id (str): 数据修改工作流ID
        app_token (str): 飞书应用Token
        my_id (str): 用户ID
        
    返回:
        int: 成功处理的记录数量
    """
    # 调用扣子飞书数据查询工作流
    task = Query_Feishu_data(config_module.coze_token, config_module.querydata_workflow_id, config_module.expert_app_token, config_module.my_id)
    
    processed_count = 0  # 记录处理的数量
    
    # 检查是否成功获取到数据
    if task and 'data' in task and task['data']:
        try:
            # 解析嵌套JSON数据
            parsed_data = json.loads(task['data'])
            
            # 确保data是列表而非None
            if 'data' in parsed_data and parsed_data['data'] and isinstance(parsed_data['data'], list):
                # 访问parsed_data中的data数组
                records = parsed_data['data']
                
                # 遍历所有记录
                for record in records:
                    # 获取记录ID
                    record_id = record['record_id']
                    
                    try:
                        # 每个记录的fields也是一个JSON字符串，需要再次解析
                        fields = json.loads(record['fields'])
                        # 访问飞书表记录的各个列表字段
                        my_name = fields['my_name'][0]['text']
                        my_id = fields['my_id'][0]['text']
                        xhs_id = fields['xhs_id'][0]['text']
                        user_id = fields['user_id'][0]['text']
                        username = fields['username'][0]['text']
                        script = fields['script'][0]['text'] if 'script' in fields and fields['script'] else ""
                        
                        print(f"[处理飞书任务] 处理回复: {username}({xhs_id})")
                        
                        # 检查script是否为空
                        if not script or script.isspace():
                            print(f"[处理飞书任务] {username}({user_id})的消息内容为空，直接标记为已处理")
                            # 直接标记为已处理
                            modify_Feishu_data(config_module.coze_token, config_module.modifydata_workflow_id, config_module.expert_app_token, record_id,"已处理")
                            processed_count += 1
                        else:
                            # 调用消息发送函数
                            
                            if send_message(username, user_id, xhs_id, script):
                                # 调用函数更改飞书记录
                                modify_Feishu_data(config_module.coze_token, config_module.modifydata_workflow_id, config_module.expert_app_token,record_id,"已发送")
                                processed_count += 1
                            else:
                                modify_Feishu_data(config_module.coze_token, config_module.modifydata_workflow_id, config_module.expert_app_token,record_id,"发送失败")
                                processed_count += 1
                        
                    except Exception as e:
                        print(f"[处理飞书任务] 处理记录时出现异常: {e}")
                        print(f"[处理飞书任务] 直接标记记录 {record_id} 为已处理")
                        # 出现异常时也直接标记为已处理
                        modify_Feishu_data(config_module.coze_token, config_module.modifydata_workflow_id, config_module.expert_app_token,record_id,"异常")
                        processed_count += 1
                
                print(f"[处理飞书任务] 完成，共处理 {processed_count} 条记录")
            else:
                print("[处理飞书任务] 没有符合条件的数据记录")
        except json.JSONDecodeError as e:
            print(f"[处理飞书任务] JSON解析错误: {e}")
        except Exception as e:
            print(f"[处理飞书任务] 处理数据时出现错误: {e}")
    else:
        print("[处理飞书任务] 未获取到有效数据，跳过处理")
    
    return processed_count

# ==============================================
# 执行层
# ==============================================
if __name__ == "__main__":

    handle_feishu_task()
    
